<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      function deepCopy(obj, map = new Map()) {
        if (obj === null || typeof obj !== "object") {
          return obj;
        }

        // 检查是否已经复制过该对象
        if (map.has(obj)) {
          return map.get(obj);
        }

        let copy;
        if (Array.isArray(obj)) {
          copy = [];
          map.set(obj, copy); // 将原始对象和复制对象关联起来
          for (let i = 0; i < obj.length; i++) {
            copy[i] = deepCopy(obj[i], map);
          }
        } else {
          copy = {};
          map.set(obj, copy); // 将原始对象和复制对象关联起来
          for (let key in obj) {
            if (obj.hasOwnProperty(key)) {
              copy[key] = deepCopy(obj[key], map);
            }
          }
        }

        return copy;
      }

      //深拷贝函数
      // function deepCopy(obj) {
      //   if (obj === null || typeof obj !== "object") {
      //     return obj;
      //   }

      //   let copy;
      //   if (Array.isArray(obj)) {
      //     copy = [];
      //     for (let i = 0; i < obj.length; i++) {
      //       copy[i] = deepCopy(obj[i]);
      //     }
      //   } else {
      //     copy = {};
      //     for (let key in obj) {
      //       if (obj.hasOwnProperty(key)) {
      //         copy[key] = deepCopy(obj[key]);
      //       }
      //     }
      //   }

      //   return copy;
      // }

      const obj1 = {
        foo: "bar",
      };
      const obj2 = {
        baz: obj1,
      };
      obj1.circularRef = obj2;

      //深拷贝
      const copy = deepCopy(obj1);

      console.log(copy);
    </script>
  </body>
</html>
